/*
Projectile.h 弹幕弹射物对象
*/

#ifndef PROJECTILE_H
#define PROJECTILE_H

#include <Player.h>

using namespace std;

/// @brief 弹幕信息结构体
struct ProjectileData {
    int maxAmmo = 1;
    float coldDown = 0.5f;
    float hitPoints = 10.0f;
    float primarySpeed = 150.0f;
    int refreshTime = 1;
    float hitRange = 10.0f;
    float lifeTime = 1.0f;
    int count = 1;
    float velocityDecreasePerBullet = 0;
    float randomspreadRange = 0;
    float randomspreadAngle = 0;
    float velocityChangePerSecond = 0;
};


/// @brief 弹幕
class Projectile {
public:
    string bulletType;
    string uuid;
    Vector2 pos = Vector2 { 0, 0 };
    Vector2 velocity = Vector2 { 0, 0 };
    float angle = 0;
    string ownerUuid;
    // 基本信息

    // 尤其注意，这里的同步不是同步所有的弹幕，
    // 而是只同步该个体
    bool requireSync = true;

    float hitRange = 10.0f;
    float hitPoints = 10.0f;
    int refreshTime = 1;
    float lifeTime = 1.0f;
    // 状态信息

    /// @brief 填充弹幕信息
    void fillBullet(string bulletType, string uuid, Vector2 pos, string ownerUuid);
    /// @brief 设置弹幕速度
    /// @param direction 方向向量
    void setVelocity(Vector2 direction);
    /// @brief 设置弹幕速度
    /// @param direction 方向向量
    /// @param speed 速度大小
    void setVelocity(Vector2 direction, float speed);
    /// @brief 更新弹幕信息
    void Update(const float rate, queue<LevelAction> &responseBuffer);
    /// @brief 打印弹幕信息
    void printProjectileInfo();
};

/// @brief 根据弹幕对象名返回武器对象
Weapon returnWeapon(string bulletType);

/// @brief 道具
class Item {
public:
    string uuid;
    Vector2 pos = Vector2 { 0, 0 };
    Vector2 velocity = Vector2 { 0, 0 };
    float receiveRange = 20.0f;
    // 基本信息

    // 尤其注意，这里的同步不是同步所有的弹幕，
    // 而是只同步该个体
    bool requireSync = true;

    /// @brief 生命周期
    float lifeTime = 25.0f;

    /// @brief 填充道具信息
    void fillItem(string uuid, Vector2 pos);
    /// @brief 设置道具的速度
    void setVelocity();
    /// @brief 更新道具对象信息
    void Update(const float rate, queue<LevelAction>& responseBuffer);
    /// @brief 打印道具对象信息
    void printItemInfo();
};

#endif